/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package traspasos.beans;

import entities.Almacen;
import entities.AlmacenTienda;
import entities.LineaInventarioAlmacen;
import entities.LineaPeticionTraspasoMercancia;
import entities.PeticionTraspasoMercancia;
import entities.ProductoTalla;
import entities.TipoTraspaso;
import entities.Usuario;
import entities.UsuarioTienda;
import entities.interfaces.TraspasoInterfaz;
import facades.AlmacenFacade;
import facades.LineaInventarioAlmacenFacade;
import facades.LineaPeticionTraspasoMercanciaFacade;
import facades.PeticionTraspasoMercanciaFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadElegida;
import qualifiers.EventoPreBorrarEntidad;
import qualifiers.EventoPreCrearEntidad;
import qualifiers.EventoPreEditarEntidad;
import qualifiers.Recurso;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named(value = "editarPeticionTraspasoMercancia")
@SessionScoped
public class EditarPeticionTraspasoMercancia implements Serializable {
    @Inject
    AlmacenFacade almacenFacade;
    @Inject
    @UsuarioLogeado
    private Usuario usuario;
    private PeticionTraspasoMercancia peticionTraspasoMercancia;
    @Inject
    private PeticionTraspasoMercanciaFacade peticionTraspasoMercanciaFacade;
    @Inject
    private LineaPeticionTraspasoMercanciaFacade lineaPeticionTraspasoMercanciaFacade;
    private List<Almacen> almacenesUsuario;
    @Inject
    @Recurso
    private List<Almacen> almacenes;
    @Inject
    LineaInventarioAlmacenFacade lineaInventarioAlmacenFacade;
    @Inject
    @EventoEntidadCreada
    private Event<LineaPeticionTraspasoMercancia> eventoNuevaLineaPeticionTraspasoMercancia;
    @Inject
    @EventoEntidadCreada
    private Event<PeticionTraspasoMercancia> eventoNuevaPeticionTraspasoMercancia;
    @Inject
    @EventoPreBorrarEntidad
    private Event<LineaPeticionTraspasoMercancia> eventoPreBorrarLineaPeticionTraspasoMercancia;
    @Inject
    @EventoPreCrearEntidad
    private Event<LineaPeticionTraspasoMercancia> eventoPreCrearLineaPeticionTraspasoMercancia;
    @Inject
    @EventoPreEditarEntidad
    private Event<LineaPeticionTraspasoMercancia> eventoPreEditarLineaPeticionTraspasoMercancia;
    /**
     * Creates a new instance of NuevaPeticionTraspasoMercancia
     */
    public EditarPeticionTraspasoMercancia() {
    }
    
    @PostConstruct
    private void init(){
        almacenesUsuario=new ArrayList<Almacen>();
        for (UsuarioTienda usuarioTienda : usuario.getUsuarioTiendaList()) {
            for(AlmacenTienda almacenTienda: usuarioTienda.getTienda().getAlmacenTiendaList()){
                almacenesUsuario.add(almacenTienda.getAlmacen());
            }
        }
    }

    
    public void onPeticionTraspasoMercanciaElegida(@Observes @EventoEntidadElegida PeticionTraspasoMercancia peticion){
        this.peticionTraspasoMercancia=peticion;
    }
    
    public void onTraspasoMercanciaElegido(@Observes @EventoEntidadElegida TraspasoInterfaz traspaso){
        if(traspaso.getTipo().equals(TipoTraspaso.PETICION.toString())){
            this.peticionTraspasoMercancia=(PeticionTraspasoMercancia)traspaso;
        }
    }
    
    public Boolean puedeEditar(){
        Boolean res=true;
        for (LineaPeticionTraspasoMercancia lineaPeticion : peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList()) {
            if(lineaPeticion.getLineaEnvioTraspasoMercanciaList()!=null){
                res=res && lineaPeticion.getLineaEnvioTraspasoMercanciaList().isEmpty();
                if(!res){
                    break;
                } 
            }
            
        }
        return res;
    }
    
    
    /**
     * @return the usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the peticionTraspasoMercancia
     */
    public PeticionTraspasoMercancia getPeticionTraspasoMercancia() {
        return peticionTraspasoMercancia;
    }

    /**
     * @param peticionTraspasoMercancia the peticionTraspasoMercancia to set
     */
    public void setPeticionTraspasoMercancia(PeticionTraspasoMercancia peticionTraspasoMercancia) {
        this.peticionTraspasoMercancia = peticionTraspasoMercancia;
    }
    
    public void editarPeticion(){
        peticionTraspasoMercanciaFacade.edit(peticionTraspasoMercancia);
    }
    
    private void prepararEdicion(){
        for (Iterator<LineaPeticionTraspasoMercancia> it = this.peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().iterator(); it.hasNext();) {
            LineaPeticionTraspasoMercancia lineaPeticion = it.next();
            if(lineaPeticion.getCantidad()==0){
                eventoPreBorrarLineaPeticionTraspasoMercancia.fire(lineaPeticion);
                lineaPeticionTraspasoMercanciaFacade.remove(lineaPeticion);
                it.remove();
            }
        }
    }
    
    public void editarProductos(){
        prepararEdicion();
        Almacen almacenConTodosLosProductos=almacenFacade.getAlmacenVentasAleatorioConTodosLosProductos(getMapLineas(this.peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList()));
        //Almacen almacenConTodosLosProductos=getAlmacenAleatorioConTodosLosProductos();
        if(peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList()==null){
            peticionTraspasoMercancia.setLineaPeticionTraspasoMercanciaList(new ArrayList<LineaPeticionTraspasoMercancia>());
        }
        for (Iterator<LineaPeticionTraspasoMercancia> it = this.peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().iterator(); it.hasNext();) {
            LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercancia = it.next();
            if(lineaPeticionTraspasoMercanciaFacade.find(lineaPeticionTraspasoMercancia.getIdLineaPeticionTraspasoMercancia()).getCantidad()!=lineaPeticionTraspasoMercancia.getCantidad()){
                if(almacenConTodosLosProductos!=null){
                    lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenConTodosLosProductos);
                    eventoPreEditarLineaPeticionTraspasoMercancia.fire(lineaPeticionTraspasoMercancia);
                    lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(almacenConTodosLosProductos));
                    lineaPeticionTraspasoMercanciaFacade.edit(lineaPeticionTraspasoMercancia);
                }
                else{
                    List<LineaPeticionTraspasoMercancia> lineasPet=new ArrayList<LineaPeticionTraspasoMercancia>();
                    lineasPet.add(lineaPeticionTraspasoMercancia);
                    Almacen almacenConEsteProductoTalla=almacenFacade.getAlmacenVentasAleatorioConTodosLosProductos(getMapLineas(lineasPet));
                    if(almacenConEsteProductoTalla!=null){
                        lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenConEsteProductoTalla);
                        eventoPreEditarLineaPeticionTraspasoMercancia.fire(lineaPeticionTraspasoMercancia);
                        lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(almacenConEsteProductoTalla));
                        lineaPeticionTraspasoMercanciaFacade.edit(lineaPeticionTraspasoMercancia);
                    }
                    else{
                        //Lógica de separar las mierdas
                        Integer cantidadRestantePorEnviar=lineaPeticionTraspasoMercancia.getCantidad();
                        List<LineaInventarioAlmacen> lineasInventarioConProductoTalla=lineaInventarioAlmacenFacade.getLineaInventarioDeAlmacenConProductoYCantidadOMas(lineaPeticionTraspasoMercancia.getProductoTalla(), 1);
                        eventoPreBorrarLineaPeticionTraspasoMercancia.fire(lineaPeticionTraspasoMercancia);
                        lineaPeticionTraspasoMercanciaFacade.remove(lineaPeticionTraspasoMercancia);
                        for (LineaInventarioAlmacen lineaInventarioAlmacen : lineasInventarioConProductoTalla) {
                            if(cantidadRestantePorEnviar!=0){
                                Integer cantidadQueEnvia=Math.min(cantidadRestantePorEnviar, lineaInventarioAlmacen.getCantidad());
                                LineaPeticionTraspasoMercancia lineaSeparada=new LineaPeticionTraspasoMercancia();
                                lineaSeparada.setAlmacenEnvio(lineaInventarioAlmacen.getAlmacen());
                                lineaSeparada.setCantidad(cantidadQueEnvia);
                                lineaSeparada.setProductoTalla(lineaPeticionTraspasoMercancia.getProductoTalla());
                                eventoPreCrearLineaPeticionTraspasoMercancia.fire(lineaPeticionTraspasoMercancia);
                                lineaPeticionTraspasoMercancia.setAlmacenEnvio(almacenFacade.getAlmacenReservaAsociado(lineaInventarioAlmacen.getAlmacen()));
                                lineaPeticionTraspasoMercanciaFacade.create(lineaSeparada);
                                peticionTraspasoMercancia.getLineaPeticionTraspasoMercanciaList().add(lineaSeparada);
                                eventoNuevaLineaPeticionTraspasoMercancia.fire(lineaSeparada);
                            }
                            else{
                                break;
                            }
                        }
                        it.remove();
                    }
                }
            }
        }
        peticionTraspasoMercanciaFacade.evict(peticionTraspasoMercancia, peticionTraspasoMercancia.getIdPeticionTraspasoMercancia());
    }

    /**
     * @return the almacenesUsuario
     */
    public List<Almacen> getAlmacenesUsuario() {
        return almacenesUsuario;
    }

    /**
     * @param almacenesUsuario the almacenesUsuario to set
     */
    public void setAlmacenesUsuario(List<Almacen> almacenesUsuario) {
        this.almacenesUsuario = almacenesUsuario;
    }
    
    public Map<ProductoTalla,Integer> getMapLineas(List<LineaPeticionTraspasoMercancia> listaPeticiones){
        Map<ProductoTalla,Integer> lineasMap=new HashMap<ProductoTalla,Integer>();
        for(LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercancia : listaPeticiones){
            if(lineaPeticionTraspasoMercancia.getCantidad()!=0){
                lineasMap.put(lineaPeticionTraspasoMercancia.getProductoTalla(), lineaPeticionTraspasoMercancia.getCantidad());
            }
        }
        return lineasMap;
    }
        
}
